Ext.namespace('Ext.ux');
Ext.ux.LoginWindow = function (config) {
    Ext.apply(this, config);
    var css = "#login-form  {background: " + this.formBgcolor + " none;}" + ".ux-auth-header-icon {background: url('" + this.basePath + "/locked.gif') 0 4px no-repeat !important;}" + ".ux-auth-form {padding:10px;}" + ".ux-auth-login {background-image: url('" + this.basePath + "/key.gif') !important}" + ".ux-auth-close {background-image: url('" + this.basePath + "/close.gif') !important}";
    Ext.util.CSS.createStyleSheet(css, this._cssId);
    if (this.forceVirtualKeyboard) {
        this.enableVirtualKeyboard = true
    }
    this.addEvents({
        'show': true,
        'reset': true,
        'success': true,
        'failure': true,
        'submit': true,
        'submitpass': true
    });
    Ext.ux.LoginWindow.superclass.constructor.call(this, config);
    this._logoPanel = new Ext.Panel({
        region: 'center',
        border: false,
        html: '<img id="captcha_img" src="'+this.url+'captcha/index/view/size/big/' + Math.random() + '" border=0 onclick="changecaptcha(this)" style="margin: 0px;" />'
    });
    this._logoRecover = new Ext.Panel({
        region: 'center',
        html: '<img id="login_img" src="'+this.url+'captcha/index/view/size/big/' + Math.random() + '" border=0 onclick="changecaptcha(this)" style="margin: 0px;" />'
    });
    this._usernameId = Ext.id();
    this._passwordId = Ext.id();
    this._rememberMeId = Ext.id();
    this._emailId = Ext.id();
    this._recoverFieldsetId = Ext.id();
    this._RecoverUsernameId = Ext.id();
    this._languageId = Ext.id();
    this._captchaId = Ext.id();
    this._RecovercaptchaId = Ext.id();
    this._loginButtonId = Ext.id();
    this._resetButtonId = Ext.id();
    this._passwordButtonId = Ext.id();
    this._passwordCloseId = Ext.id();
    this._winPasswordButtonId = Ext.id();
    this._formPanel = new Ext.form.FormPanel({
        region: 'south',
        border: true,
        bodyStyle: "padding: 10px; border-left: none; border-right: none; border-bottom: none;",
        waitMsgTarget: true,
        id: 'login-form',
        labelWidth: 80,
        defaults: {
            width: 300
        },
        height: 100,
        items: [{
            xtype: 'textfield',
            id: this._usernameId,
            name: this.usernameField,
            emptyText: 'Vui lòng nhập tên đăng nhập!',
            fieldLabel: 'Username',
            vtype: this.usernameVtype,
            validateOnBlur: false,
            maxLength: 15,
            allowBlank: false
        }, {
            xtype: 'textfield',
            inputType: 'password',
            id: this._passwordId,
            name: this.passwordField,
            fieldLabel: 'Mật khẩu',
            vtype: this.passwordVtype,
            width: this.enableVirtualKeyboard == true ? 280 : 300,
            validateOnBlur: false,
            allowBlank: false,
            maskRe: /([a-zA-Z0-9\_\s]+)$/,
            validationEvent: this.forceVirtualKeyboard == true ? 'blur' : 'keyup',
            enableKeyEvents: true,
            keyboardConfig: {
                showIcon: true,
                languageSelection: true
            },
            plugins: this.enableVirtualKeyboard == true ? new Ext.ux.plugins.VirtualKeyboard() : null,
            listeners: {
                render: function () {
                    this.capsWarningTooltip = new Ext.ToolTip({
                        target: this.id,
                        anchor: 'top',
                        width: 305,
                        html: '<div class="ux-auth-warning"><b>Caps lock được kích hoạt ...</b></div>' + 'Lưu ý: nếu Caps lock bật, bạn có thể nhập mật khẩu không chính xác! ' + 'Xin vui lòng tắt Caps lock trước khi nhập lại mật khẩu...'
                    });
                    this.capsWarningTooltip.disable();
                    this.capsWarningTooltip.on('enable', function () {
                        this.disable()
                    })
                },
                keypress: {
                    fn: function (field, e) {
                        if (this.forceVirtualKeyboard) {
                            field.plugins.expand();
                            e.stopEvent()
                        } else {
                            var charCode = e.getCharCode();
                            if ((e.shiftKey && charCode >= 97 && charCode <= 122) || (!e.shiftKey && charCode >= 65 && charCode <= 90)) {
                                field.capsWarningTooltip.show()
                            } else {
                                if (field.capsWarningTooltip.hidden == false) {
                                    field.capsWarningTooltip.hide()
                                }
                            }
                        }
                    },
                    scope: this
                },
                blur: function (field) {
                    if (this.capsWarningTooltip.hidden == false) {
                        this.capsWarningTooltip.hide()
                    }
                }
            }
        }, {
            xtype: 'textfield',
            id: this._captchaId,
            name: this.captchaField,
            emptyText: 'Click vào hình bên trên để đổi mã bảo vệ!',
            fieldLabel: 'Mã bảo vệ',
            vtype: this.usernameVtype,
            validateOnBlur: false,
            maxLength: 6,
            allowBlank: false
        }]
    });
    this._formPasswordPanel = new Ext.form.FormPanel({
        bodyStyle: "padding: 5px; border-top: none;",
        id: 'password-form',
        waitMsgTarget: true,
        labelWidth: 80,
        buttonAlign: 'center',
        height: 170,
        baseParams: {
            task: 'forgotPassword'
        },
        items: [{
            layout: 'form',
            border: false,
            items: [{
                xtype: 'fieldset',
                title: 'Nhập username và email...',
                id: this._recoverFieldsetId,
                autoHeight: true,
                items: [{
                    xtype: 'textfield',
                    id: this._RecoverUsernameId,
                    name: this.RecoverUsernameField,
                    fieldLabel: 'Username',
                    vtype: this.RecoverUsernameVtype,
                    validateOnBlur: false,
                    maxLength: 20,
                    emptyText: 'Nhập Username của bạn...',
                    anchor: '98%',
                    allowBlank: false
                }, {
                    xtype: 'textfield',
                    vtype: this.emailVtype,
                    id: this._emailId,
                    name: this.emailField,
                    fieldLabel: 'Email',
                    validateOnBlur: false,
                    emptyText: 'Nhập chính xác địa chỉ email của bạn...',
                    anchor: '98%',
                    allowBlank: false
                }, {
                    xtype: 'textfield',
                    vtype: this.RecoverUsernameVtype,
                    id: this._RecovercaptchaId,
                    name: this.RecoverCaptchaField,
                    fieldLabel: 'Mã bảo vệ',
                    emptyText: 'Click vào hình bên trên để đổi mã bảo vệ!',
                    validateOnBlur: false,
                    anchor: '98%',
                    allowBlank: false
                }]
            }]
        }],
        buttons: [{
            text: 'Lấy lại mật khẩu',
            id: this._winPasswordButtonId,
            width: 100,
            handler: this.Passwordsubmit,
            scale: 'medium',
            scope: this
        }, {
            text: 'Đóng',
            id: this._passwordCloseId,
            width: 100,
            handler: this.CloseRecover,
            scale: 'medium',
            scope: this
        }]
    });
    var buttons = [{
        id: this._loginButtonId,
        text: 'Đăng nhập',
        handler: this.submit,
        scale: 'medium',
        scope: this
    }]; /*var keys=[{key:[10,13],handler:this.submit,scope:this}];*/
    if (typeof this.passwordButton == 'string') {
        buttons.push({
            id: this._passwordButtonId,
            text: 'Lấy lại mật khẩu',
            handler: this.password,
            scale: 'medium',
            scope: this
        })
    }
    if (typeof this.resetButton == 'string') {
        buttons.push({
            id: this._resetButtonId,
            text: 'Reset',
            handler: this.reset,
            scale: 'medium',
            scope: this
        })
    }
    this._window = new Ext.Window({
        width: 429,
        height: 280,
        closable: false,
        resizable: false,
        draggable: false,
        modal: this.modal,
        iconCls: 'ux-auth-header-icon',
        title: 'Đăng nhập',
        layout: 'border',
        bodyStyle: 'padding:5px;',
        buttons: buttons,
        buttonAlign: 'center',
        /*keys:keys,*/
        plain: false,
        id: 'form-vd',
        items: [this._logoPanel, this._formPanel]
    });
    this._window.on('show', function () {
        Ext.getCmp(this._passwordId).setRawValue('');
        this.fireEvent('show', this)
    }, this);
    this._windowPassword = new Ext.Window({
        width: 429,
        height: 315,
        closable: false,
        resizable: false,
        modal: this.modal,
        draggable: false,
        iconCls: 'ux-auth-header-icon',
        title: 'Lấy lại mật khẩu',
        bodyStyle: 'padding:5px;',
        /*keys:keys,*/
        animateTarget: this._passwordButtonId,
        id: 'form-pass',
        items: [this._logoRecover, this._formPasswordPanel]
    });
    this._windowPassword.on('show', function () {
        this._formPasswordPanel.getForm().reset()
    }, this)
};
Ext.extend(Ext.ux.LoginWindow, Ext.util.Observable, {
    title: '',
    sucesso: '',
    falha: '',
    Passwordtitle: '',
    recoverFieldset: '',
    waitMessage: '',
    loginButton: '',
    passwordButton: '',
    resetButton: '',
    usernameLabel: '',
    usernameField: 'username',
    captchaField: 'captcha',
    usernameVtype: 'alphanum',
    passwordLabel: ' ',
    passwordField: 'password',
    passwordVtype: 'alphanum',
    emailLabel: '',
    captchaLabel: '',
    emailField: 'email',
    emailVtype: 'email',
    RecorverUsernameLabel: '',
    RecoverUsernameField: 'username',
    RecoverCaptchaField: 'captcha',
    RecoverUsernameVtype: 'alphanum',
    languageLabel: '',
    languageField: 'lang',
    rememberMeLabel: 'Nhớ tên đăng nhập?',
    rememberMeField: 'rememberme',
    notRecommended: 'Không nên dùng cho các máy tính được chia sẻ.',
    enableVirtualKeyboard: false,
    forceVirtualKeyboard: false,
    encryptType: 'md5',
    salt: '',
    url: '',
    emailUrl: '',
    locationUrl: '',
    basePath: '',
    winBanner: '',
    formBgcolor: '',
    defaultLanguage: 'vi',
    method: 'post',
    modal: false,
    _cssId: 'ux-LoginWindow-css',
    _logoPanel: null,
    _formPanel: null,
    _window: null,
    _windowPassword: null,
    show: function (el) {
        this._window.show(el);
        if (Ext.state.Manager.get('username')) {
            Ext.getCmp(this._usernameId).setValue(Ext.state.Manager.get('username'))
        } else {
            Ext.getCmp(this._usernameId).emptyText = 'Vui lòng nhập tên đăng nhập!'
        }
    },
    password: function (el) {
        this._windowPassword.show(el);
        Ext.getDom('login_img').src = this.url + 'captcha/index/view/size/big/' + Math.random();
    },
    reset: function () {
        if (this.fireEvent('reset', this)) {
            this._formPanel.getForm().reset()
        }
    },
    destroy: function () {
        this._window.hide();
        this.purgeListeners();
        Ext.util.CSS.removeStyleSheet(this._cssId);
        var self = this;
        delete self
    },
    submit: function () {
        var loginMark = new Ext.LoadMask(Ext.getDom('form-vd'), {
            msg: "Đang tải dữ liệu, xin vui lòng đợi...",
            modal: true
        });
        var form = this._formPanel.getForm();
        if (form.isValid()) {
            loginMark.show();
            if (this.encryptType == 'md5') {
                Ext.getCmp(this._passwordId).setRawValue(Ext.util.MD5(Ext.getCmp(this._passwordId).getValue()))
            } else if (this.encryptType == 'sha1') {
                Ext.getCmp(this._passwordId).setRawValue(Ext.ux.Crypto.SHA1.hash(this.salt + Ext.getCmp(this._passwordId).getValue()))
            }
            if (this.fireEvent('submit', this, form.getValues())) {
                Ext.Ajax.request({
                    url: this.url + 'admincpanel/public/auth',
                    params: {
                        task: 'login',
                        uname: Ext.getCmp(this._usernameId).getValue(),
                        upass: Ext.getCmp(this._passwordId).getValue(),
                        captcha: Ext.getCmp(this._captchaId).getValue()
                    },
                    success: function (response) {
                        var result = response.responseText;
						var newSrc = Ext.getDom('captcha_img').src + Math.floor(Math.random()*1);
                        Ext.getDom('captcha_img').src = newSrc;
                        loginMark.hide();
                        switch (result) {
                        case 'A record with the supplied identity could not be found.':
                            Ext.TipOK.msg('Warning:', 'Tài khoản không chính xác.');
                            break;
                        case 'Supplied credential is invalid.':
                            Ext.TipOK.msg('Warning:', 'Mật khẩu không chính xác.');
                            break;
                        case 'InvalidCaptcha':
                            Ext.TipOK.msg('Warning:', 'Mã bảo vệ không chính xác!');
                            break;
						case 'locked': case 'lockedok':
                            Ext.TipOK.msg('Warning:', 'Tài khoản của bạn đã bị khóa, xin vui lòng liên hệ với người quản trị để biết thêm thông tin!');
                            break;
                        case 'ok':
                            window.location.reload();
                            break;
                        default:
                            Ext.TipOK.msg('Warning:', result);
                            break
                        }
                    },
                    failure: function (response) {
                        Ext.TipOK.msg('Error:', 'Không thể kết nối đến server...')
                    }
                })
            }
        }
    },
    Passwordsubmit: function () {
        passMark = new Ext.LoadMask(Ext.getDom('form-pass'), {
            msg: "Đang tải dữ liệu, xin vui lòng đợi...",
            modal: true
        });
        var form = this._formPasswordPanel.getForm();
        if (form.isValid()) {
            passMark.show();
            if (this.fireEvent('submitpass', this, form.getValues())) {
                Ext.Ajax.request({
                    url: this.url + 'admincpanel/public/pass-recover',
                    params: {
                        task: 'recover',
                        uname: Ext.getCmp(this._RecoverUsernameId).getValue(),
                        uemail: Ext.getCmp(this._emailId).getValue(),
                        captcha: Ext.getCmp(this._RecovercaptchaId).getValue()
                    },
                    success: function (response) {
                        var result = response.responseText;
						var newSrc = Ext.getDom('login_img').src + Math.floor(Math.random()*1);
                        Ext.getDom('login_img').src = newSrc;
                        passMark.hide();
                        switch (result) {
                        case 'email':
                            Ext.TipOK.msg('Warning:', 'Địa chỉ email không tồn tại!');
                            break;
                        case 'name':
                            Ext.TipOK.msg('Warning:', 'Username không chính xác!');
                            break;
                        case 'captcha':
                            Ext.TipOK.msg('Warning:', 'Mã bảo vệ không chính xác!');
                            break;
                        case 'ok':
                            Ext.TipOK.msg('Susessful:', 'Mật khẩu mới đã được gửi về email của bạn!');
                            break;
                        default:
                            Ext.TipOK.msg('Warning:', 'Host không hỗ trợ gửi email. Xin vui lòng liên hệ tranvietduchn@gmail.com để được hỗ trợ...');
                            break
                        }
                    },
                    failure: function (response) {
                        var result = response.responseText;
                        Ext.TipOK.msg('Error:', result)
                    }
                })
            }
        }
    },
    CloseRecover: function () {
        this._windowPassword.hide();
        Ext.getDom('captcha_img').src = this.url + 'captcha/index/view/size/big/' + Math.random();
    }
});